package locadora.negocio.pessoas;

import java.io.Serializable;
import java.util.ArrayList;

import miscelanea.Data;

public class Cliente extends Pessoa implements Serializable {

	private static final long serialVersionUID = 1L;
	//Indicador de débido ou crédito em nome do Cliente
	private float situacaoFinanceira = 0;
	//Lista de chaves de itens pendentes de entrega
	private ArrayList<Long> listaPendenciaMateriais;

	/**
	 * Cria uma instância de um Cliente, exatamente como se faz no tipo Pessoa, além de definir uma lista de pendência de materiais nula
	 * @param nome nome da pessoa
	 * @param dataNascimento data de nascimento da pessoa
	 * @param identidade número da identidade no formato XXXXX, onde X é um algarismo
	 * @param orgaoExpedidor nome do órgão expedidor
	 * @param CPF número do CPF no formato XXXXXXXXXXX, no qual X é um algarismo
	 * @param logradouro nome do logradouro
	 * @param CEP CEP no formato XXXXXXXX, no qual X é um algarismo
	 * @param bairro nome do bairro
	 * @param cidade nome da cidade
	 * @param estado nome do estado
	 * @throws Exception caso um Gerente tente adicionar uma pessoa já cadastrada ou algum outro tipo de Pessoa que não seja Cliente ou Funcionário
	 */
	public Cliente(String nome, Data dataNascimento, String identidade, String orgaoExpedidor, String CPF, String logradouro, String CEP, String bairro, String cidade, String estado) throws Exception {
		super(nome, dataNascimento, identidade, orgaoExpedidor, CPF, logradouro, CEP, bairro, cidade, estado);
		this.listaPendenciaMateriais = new ArrayList<Long>();
	}
	
	/**
	 * Define a lista de pendência de material do Cliente
	 * @param pendencias lista de pendências
	 */
	protected void setPendencias(ArrayList<Long> pendencias) {
		this.listaPendenciaMateriais = pendencias;
	}
	
	/**
	 * Retorna a lista de pendências de material do Cliente
	 * @return lista de pendências
	 */
	public ArrayList<Long> getPendencias() {
		return this.listaPendenciaMateriais;
	}
	
	/**
	 * Retorna a situação financeira do Cliente. Valor positivos indicam crédito e negativos indicam dívida.
	 * @return situação financeira do Cliente
	 */
	public float getSituacaoFInanceira(){
		return this.situacaoFinanceira;
	}

	/**
	 * Define um novo valor para a situação financeira do Cliente
	 * @param situacaoFinanceira novo valor de situação financeira
	 */
	protected void setSituacaoFinanceira(float situacaoFinanceira) {
		this.situacaoFinanceira = situacaoFinanceira;
	}

	/**
	 * Aumenta a dívida do Cliente
	 * @param valorDebito valor a diminuir da situação financeira do Cliente
	 */
	public void debitar(float valorDebito){
		this.situacaoFinanceira -= valorDebito;
	}
	
	/**
	 * Aumenta o crédito do Cliente
	 * @param valorCredito valor a adicionar à situação financeira do Cliente 
	 */
	public void creditar(float valorCredito){
		this.situacaoFinanceira += valorCredito;
	}
	
	/**
	 * Adiciona a chave de um material à lista de pendências do Cliente
	 * @param chaveItem chave do Item a ser inserido na lista de pendência de materiais do cliente
	 */
	public void adicionaPendenciaMaterial(long chaveItem){
		this.listaPendenciaMateriais.add(chaveItem);
	}
	
	/**
	 * Remove a chave de um Item da lista de pendencias de material do Cliente
	 * @param chaveItem chave do Item a ser removido
	 */
	public void removePendenciaMaterial(Long chaveItem){
		if(chaveItem != null){
			for(int i = 0; i < this.listaPendenciaMateriais.size(); i++){
				if(this.listaPendenciaMateriais.get(i).toString() == chaveItem.toString()){
					this.listaPendenciaMateriais.remove(i);
				}
			}
		}
	}

}
